/**
给你一个链表的头节点 head ，判断链表中是否有环。 

 如果链表中有某个节点，可以通过连续跟踪 next 指针再次到达，则链表中存在环。 为了表示给定链表中的环，评测系统内部使用整数 pos 来表示链表尾连接到链表
中的位置（索引从 0 开始）。注意：pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。 

 如果链表中存在环 ，则返回 true 。 否则，返回 false 。 

 

 示例 1： 

 

 
输入：head = [3,2,0,-4], pos = 1
输出：true
解释：链表中有一个环，其尾部连接到第二个节点。
 

 示例 2： 

 

 
输入：head = [1,2], pos = 0
输出：true
解释：链表中有一个环，其尾部连接到第一个节点。
 

 示例 3： 

 

 
输入：head = [1], pos = -1
输出：false
解释：链表中没有环。
 

 

 提示： 

 
 链表中节点的数目范围是 [0, 10⁴] 
 -10⁵ <= Node.val <= 10⁵ 
 pos 为 -1 或者链表中的一个 有效索引 。 
 

 

 进阶：你能用 O(1)（即，常量）内存解决此问题吗？ 

 Related Topics 哈希表 链表 双指针 👍 1788 👎 0

*/

package com.shuzijun.leetcode.editor.cn;

import java.util.HashSet;
import java.util.List;

public class LinkedListCycle{

    public boolean hasCycle(ListNode head) {
        HashSet<ListNode> hashSet = new HashSet<>();
        ListNode p = head;
        while (p != null){
            if (hashSet.contains(p)){
                return true;
            }else {
                hashSet.add(p);
            }
            p = p.next;
        }
        return false;
    }
//    public static void main(String[] args) {
//         Solution solution = new LinkedListCycle().new Solution();
//
//        //声明链表
//        ListNode firstNode = new ListNode(3);
//        ListNode secondNode = new ListNode(2);
//        ListNode thitdNode = new ListNode(0);
//        ListNode fourthNode = new ListNode(-4);
//        //将链表用next方法链接
//        firstNode.next = secondNode;
//        secondNode.next = thitdNode;
//        thitdNode.next = fourthNode;
//        //输出链表的值
//        //next为指向下一个链表节点，val为获取节点的值
//        System.out.println(firstNode.next.val);
//
//
//        System.err.println(solution.hasCycle(firstNode));
//
//    }
    //leetcode submit region begin(Prohibit modification and deletion)
/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
//    public boolean hasCycle(ListNode head) {
//        HashSet<ListNode> hashTable = new HashSet<>();
//        ListNode p = head;
//        while (p != null){
//            if (hashTable.contains(p)){
//                return true;
//            } else {
//                hashTable.add(p);
//            }
//            p = p.next;
//        }
//        return false;
//    }

//    public boolean hasCycle(ListNode head) {
//        if (head == null)return false;
//        ListNode slow = head;
//        ListNode fast = head.next;
//        while (fast!= null && fast.next != null && slow != fast ){
//            slow = slow.next;
//            fast = fast.next.next;
//        }
//        if (slow == fast) return true;
//        return false;
//
//    }



//    public boolean hasCycle(ListNode head) {
//        if (head == null) {
//            return false;
//        }
//        ListNode slow = head;
//        ListNode fast = head.next;
//        while (fast != null && fast.next != null && slow != fast){
//            slow = slow.next;
//            fast = fast.next.next;
//        }
//        if (slow == fast){
//            return true;
//        }
//        return false;
////        ListNode slow = head;
////        ListNode fast = head.next;
////        while (fast != null && fast.next != null && slow != fast) {
////            slow = slow.next;
////            fast = fast.next.next;
////        }
////        if (slow == fast) {
////            return true;
////        }
////        return false;
//    }
}
//leetcode submit region end(Prohibit modification and deletion)

}